<template>
  <div style="background-color: lightgrey;height: 500px;color: blue;overflow: auto;">
    测试工作审批内嵌页面（仅框架内详情Iframe页面）
    <hr />
    参数1：approveObject，当前选中待办的所有信息，供页面使用
    <pre>{{ approveObject }}</pre>
    <hr />
    参数2：buttons，当前审批页面配置的按钮，可以使用也可以完全自定义处理
    <pre>{{ buttons }}</pre>
  </div>
</template>

<script>
export default {
  name: "ApproveFrame",
  props: {
    approveObject: Object,
    buttons: Array,
  },
  methods: {
    /**
     * 拦截按钮重命名
     *
     * @param button 按钮对象
     */
    __WF_APPROVE_FRAME_BUTTON_RENAME(button) {
      // 根据事件名称修改按钮名字，返回undefined表示使用默认名称
      // 按钮对象参考流程管理平台类：com.zbiti.wf.core.constant.ApproveButtonEnum
      // close:关闭，pass:通过，pass_and_next:通过，reject:驳回，reject_and_next:驳回，reject_to_starter:驳回发起人，
      // customize_1:自定义1，customize_2:自定义2，customize_3:自定义3
      if(button && button.code){
        switch(button.code){
          case 'close': // 关闭
            break;
          case 'pass': // 通过
            return '通过1';
          case 'pass_and_next': // 通过并选择下一步处理人
            return '通过2';
          case 'reject': // 驳回
            break;
          case 'reject_and_next': // 驳回并选择下一步处理人
            return '驳回2';
          case 'reject_to_starter': // 驳回发起人
            break;
          case 'customize_1': // 自定义1
            return '我的按钮';
          case 'customize_2': // 自定义1
            break;
          case 'customize_3': // 自定义1
            break;
        }
      }
      return undefined;
    },

    /**
     * 自定义1按钮事件（不可以与下面的拦截所有按钮分发事件同时定义）
     *
     * @param event 事件名称
     * @param taskId 待办ID
     * @param params 传入参数(业务参数，流程相关参数通过approveObject获取)
     */
    __WF_APPROVE_FRAME_customize1Handler_HANDLE_INTERCEPT(event, taskId, params, callbackFunc) {
      console.log("【待办审批页面】自定义按钮处理: event=" + event + "，taskId=" + taskId + "，params=" + params);
      this.msgSuccess("approveFrame中自定义1按钮处理");

      // 回调关闭审批页面
      callbackFunc(event,params);
    },

    /**
     * 拦截【所有】按钮分发事件
     *
     * @param event 事件编码
     * @param taskId 待办任务ID
     * @param doHandler 原平台处理句柄
     */
    __WF_APPROVE_FRAME_HANDLE_INTERCEPT(event, taskId, doHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【所有】按钮分发事件：event=" + event + "，taskId=" + taskId);
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doHandler(event, taskId, this.approveObject, (data) => {
        // 3、调用完原平台关闭按钮方法后回调
        console.log("【内嵌IFrame页面】调用审批页面doHandler回调：data = ", data);
      });
    },

    /**
     * 拦截【关闭】按钮事件
     *
     * @param taskId 待办任务ID
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doCloseHandler 原平台关闭按钮处理句柄
     */
    __WF_APPROVE_FRAME_CLOSE_HANDLE_INTERCEPT(taskId, params, callbackFunc, doCloseHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【关闭】按钮分发事件：taskId=" + taskId + "，params=", params);
      params.passParam = 'doCloseHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doCloseHandler(taskId, params, callbackFunc);

      // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doCloseHandler(taskId, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doCloseHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【通过】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doPassHandler 原平台通过按钮处理句柄
     */
    __WF_APPROVE_FRAME_PASS_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doPassHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doPassHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doPassHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doPassHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doPassHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【通过并选择下一步处理人】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doPassAndNextHandler 原平台通过并选择下一步处理人按钮处理句柄
     */
    __WF_APPROVE_FRAME_PASS_AND_NEXT_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doPassAndNextHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过并选择下一步处理人】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doPassAndNextHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doPassAndNextHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doPassAndNextHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doPassAndNextHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【通过并选择下一步处理人】按钮中选完人事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doPassAndNextHandler 原平台通过并选择下一步处理人按钮处理句柄
     */
    __WF_INTERCEPT_SELECT_WF_NEXT_USER_COMPLETE_TASK(obj, taskId, isApprove, approveComment, params) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过并选择下一步处理人】按钮选完人事件：taskId=" + taskId + "，isApprove=", isApprove+ "，approveComment=", approveComment + "，params=", params);
      // 继续提交
      params.newParam = "newParam";
      console.log("提交流程");
      obj.wfClient.completeTask(obj, taskId, isApprove, approveComment, params);
    },

    /**
     * 拦截【通过（带模型能力）】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doPassWithModelHandler 原平台通过按钮处理句柄
     */
    __WF_APPROVE_FRAME_PASS_WITH_MODEL_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doPassWithModelHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过（带模型能力）】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doPassWithModelHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doPassWithModelHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doPassWithModelHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doPassWithModelHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【通过并选择下一步处理人（带模型能力）】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doPassWithModelAndNextHandler 原平台通过并选择下一步处理人按钮处理句柄
     */
    __WF_APPROVE_FRAME_PASS_WITH_MODEL_AND_NEXT_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doPassWithModelAndNextHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过并选择下一步处理人（带模型能力）】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doPassWithModelAndNextHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doPassWithModelAndNextHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doPassWithModelAndNextHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doPassWithModelAndNextHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【通过并选择下一步处理人（带模型能力）】按钮中选完人事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     */
    __WF_INTERCEPT_SELECT_WF_NEXT_USER_WITH_MODEL_COMPLETE_TASK(obj, taskId, isApprove, approveComment, params) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【通过并选择下一步处理人（带模型能力）】按钮选完人事件：taskId=" + taskId + "，isApprove=", isApprove+ "，approveComment=", approveComment + "，params=", params);
      // 继续提交
      params.newParam = "newParam";
      console.log("提交流程");
      obj.wfClient.updateAndCompleteTask(obj, taskId, isApprove, approveComment, params);
    },

    /**
     * 拦截【驳回】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doRejectHandler 原平台驳回按钮处理句柄
     */
    __WF_APPROVE_FRAME_REJECT_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doRejectHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【驳回】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doRejectHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doRejectHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doRejectHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doRejectHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【驳回并选择下一步处理人】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doRejectAndNextHandler 原平台驳回按钮处理句柄
     */
    __WF_APPROVE_FRAME_REJECT_AND_NEXT_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doRejectAndNextHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【驳回并选择下一步处理人】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);
      params.passParam = 'doRejectAndNextHandler';

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doRejectAndNextHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doRejectAndNextHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doRejectAndNextHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【驳回发起人】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doRejectToStarterHandler 原平台驳回发起人按钮处理句柄
     */
    __WF_APPROVE_FRAME_REJECT_TO_STARTER_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doRejectToStarterHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【驳回发起人】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      // 方案一：直接调用原callbackFunc
      // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      doRejectToStarterHandler(taskId, approveComment, params, callbackFunc);

      // // 方案二：在处理完后回调，此时需要自己调用原callbackFunc方法，不调用则表示阻止
      // // 2、继续原有的流程处理（如果没有调用，需要自己处理后续流程）
      // doRejectToStarterHandler(taskId, approveComment, params, (data) => {
      //   // 3、调用完原功能后回调
      //   console.log("【内嵌IFrame页面】调用审批页面doRejectToStarterHandler回调：data = ", data);
      //   // 4、调用原平台doHandler的回调方法
      //   if (typeof callbackFunc === 'function') {
      //     callbackFunc(data);
      //   }
      // });
    },

    /**
     * 拦截【废弃】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（废弃理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doDiscardHandler 原平台废弃按钮处理句柄
     */
    __WF_APPROVE_FRAME_DISCARD_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doDiscardHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【废弃】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行废弃处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【签入】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（签入理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doCheckInHandler 原平台签入按钮处理句柄
     */
    __WF_APPROVE_FRAME_CLAIM_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doCheckInHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【签入】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行签入处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【签出】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（签出理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doCheckOutHandler 原平台签出按钮处理句柄
     */
    __WF_APPROVE_FRAME_UNCLAIM_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doCheckOutHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【签出】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行签出处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【转办】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（转办理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doTransferHandler 原平台转办按钮处理句柄
     */
    __WF_APPROVE_FRAME_TRANSFER_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doTransferHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【转办】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行转办处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【前加签】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（转办理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doBeforeAddSignHandler 原平台前加签按钮处理句柄
     */
    __WF_APPROVE_FRAME_ADD_BEFORE_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doBeforeAddSignHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【前加签】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行转办处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【后加签】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（转办理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param doAfterAddSignHandler 原平台后加签按钮处理句柄
     */
    __WF_APPROVE_FRAME_ADD_AFTER_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, doAfterAddSignHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【后加签】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行转办处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },

    /**
     * 拦截【驳回到指定节点】按钮事件
     *
     * @param taskId 待办任务ID
     * @param approveComment 审批意见（转办理由）
     * @param params doHandler传入的参数
     * @param callbackFunc doHandler传入的回调函数
     * @param rejectedTaskTargetHandler 原平台驳回到指定节点按钮处理句柄
     */
    __WF_APPROVE_FRAME_REJCET_TO_START_HANDLE_INTERCEPT(taskId, approveComment, params, callbackFunc, rejectedTaskTargetHandler) {
      // 1、处理业务逻辑
      console.log("【内嵌IFrame页面】拦截【驳回到指定节点】按钮分发事件：taskId=" + taskId + "，approveComment=", approveComment + "，params=", params);

      this.msgSuccess("调用自己的后台逻辑进行转办处理");
      // 2、回调全局拦截的回调函数
      if (typeof callbackFunc === 'function') {
        callbackFunc({ taskId, approveComment, params });
      }
    },
  }
}
</script>

<style lang="scss" scoped>
</style>